Skill

Enum হ্যান্ডল করা

Java Technologies - জ্যাকসন (Jackson)
209

Jackson ব্যবহার করে Java Enum হ্যান্ডল করা একটি সাধারণ এবং কার্যকর প্রক্রিয়া। এটি Enum-এর মানগুলো JSON-এ সিরিয়ালাইজ বা ডেসিরিয়ালাইজ করতে এবং প্রয়োজনে কাস্টম ফরম্যাটিং প্রয়োগ করতে সাহায্য করে।


১. Enum-কে JSON-এ সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা

উদাহরণ:

import com.fasterxml.jackson.databind.ObjectMapper;

public class EnumExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        // Enum সিরিয়ালাইজ করা
        String json = objectMapper.writeValueAsString(Status.ACTIVE);
        System.out.println("Serialized JSON: " + json);

        // Enum ডেসিরিয়ালাইজ করা
        Status status = objectMapper.readValue("\"INACTIVE\"", Status.class);
        System.out.println("Deserialized Enum: " + status);
    }

    public enum Status {
        ACTIVE, INACTIVE, PENDING;
    }
}

আউটপুট:

Serialized JSON: "ACTIVE"
Deserialized Enum: INACTIVE

২. কাস্টম Enum সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন

যদি আপনি চান Enum-এর ডিফল্ট মানের পরিবর্তে কাস্টম স্ট্রিং ব্যবহার করতে, @JsonValue এবং @JsonCreator ব্যবহার করতে পারেন।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

public class CustomEnumExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        // Enum সিরিয়ালাইজ করা
        String json = objectMapper.writeValueAsString(Status.ACTIVE);
        System.out.println("Serialized JSON: " + json);

        // Enum ডেসিরিয়ালাইজ করা
        Status status = objectMapper.readValue("\"Pending Status\"", Status.class);
        System.out.println("Deserialized Enum: " + status);
    }

    public enum Status {
        ACTIVE("Active Status"),
        INACTIVE("Inactive Status"),
        PENDING("Pending Status");

        private final String description;

        Status(String description) {
            this.description = description;
        }

        @JsonValue
        public String getDescription() {
            return description;
        }

        @JsonCreator
        public static Status forValue(String value) {
            for (Status status : values()) {
                if (status.description.equalsIgnoreCase(value)) {
                    return status;
                }
            }
            throw new IllegalArgumentException("Unknown value: " + value);
        }
    }
}

আউটপুট:

Serialized JSON: "Active Status"
Deserialized Enum: PENDING

৩. Enum-এর সাথে অতিরিক্ত তথ্য সিরিয়ালাইজ করা

যদি আপনি Enum-এর সাথে অতিরিক্ত ডেটা সংযুক্ত করতে চান, তাহলে আপনি একটি কাস্টম Serializer ব্যবহার করতে পারেন।

উদাহরণ:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.IOException;

public class AdvancedEnumExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        // Enum সিরিয়ালাইজ করা
        String json = objectMapper.writeValueAsString(Status.ACTIVE);
        System.out.println("Serialized JSON: " + json);
    }

    @JsonSerialize(using = StatusSerializer.class)
    public enum Status {
        ACTIVE("Active Status", 1),
        INACTIVE("Inactive Status", 0),
        PENDING("Pending Status", 2);

        private final String description;
        private final int code;

        Status(String description, int code) {
            this.description = description;
            this.code = code;
        }

        public String getDescription() {
            return description;
        }

        public int getCode() {
            return code;
        }
    }

    public static class StatusSerializer extends JsonSerializer<Status> {
        @Override
        public void serialize(Status status, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeStartObject();
            gen.writeStringField("description", status.getDescription());
            gen.writeNumberField("code", status.getCode());
            gen.writeEndObject();
        }
    }
}

আউটপুট:

{
  "description": "Active Status",
  "code": 1
}

৪. Enum ডেসিরিয়ালাইজ করার সময় ভিন্ন ফরম্যাট হ্যান্ডল করা

উদাহরণ:

import com.fasterxml.jackson.databind.ObjectMapper;

public class FlexibleEnumExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        // JSON ডেটা বিভিন্ন ফরম্যাটে
        String json1 = "\"ACTIVE\"";
        String json2 = "\"active\"";

        Status status1 = objectMapper.readValue(json1, Status.class);
        Status status2 = objectMapper.readValue(json2, Status.class);

        System.out.println("Status1: " + status1);
        System.out.println("Status2: " + status2);
    }

    public enum Status {
        ACTIVE, INACTIVE, PENDING;

        // Case-insensitive ডেসিরিয়ালাইজেশন
        @JsonCreator
        public static Status forValue(String value) {
            return Status.valueOf(value.toUpperCase());
        }
    }
}

আউটপুট:

Status1: ACTIVE
Status2: ACTIVE

গুরুত্বপূর্ণ পয়েন্ট

  1. ডিফল্ট সিরিয়ালাইজেশন: Enum-এর name() পদ্ধতির মান JSON এ সংরক্ষিত হয়।
  2. কাস্টম ভ্যালু হ্যান্ডলিং: @JsonValue এবং @JsonCreator কাস্টমাইজেশন করতে ব্যবহার করা হয়।
  3. কেস-ইনসেনসিটিভ ডেসিরিয়ালাইজেশন: @JsonCreator ব্যবহার করে JSON ভ্যালু Uppercase, Lowercase বা Mixed Case হ্যান্ডল করা যায়।
  4. অতিরিক্ত তথ্য সংযুক্তি: কাস্টম Serializer ব্যবহার করে Enum-এর সাথে অতিরিক্ত ডেটা সিরিয়ালাইজ করা যায়।

Jackson দিয়ে Java Enum হ্যান্ডল করা খুবই সহজ এবং শক্তিশালী। ডিফল্ট ফিচারগুলো ছাড়াও কাস্টমাইজেশন করার জন্য বেশ কিছু Annotation এবং Serializer পাওয়া যায়। Enum-এর ক্ষেত্রে @JsonValue এবং @JsonCreator সবচেয়ে বেশি ব্যবহৃত হয় কাস্টম মান হ্যান্ডল করার জন্য।

Content added By

Enum Serialization এবং Deserialization

221

Jackson লাইব্রেরি Java-এর Enum টাইপের সাথে JSON ডেটা আদান-প্রদানের সময় Serialization (Java থেকে JSON) এবং Deserialization (JSON থেকে Java)-কে সাপোর্ট করে।


Serialization এবং Deserialization কি?

  1. Serialization: Java Enum-কে JSON ফরম্যাটে রূপান্তর।
  2. Deserialization: JSON ফরম্যাট থেকে Enum টাইপে রূপান্তর।

Default Behavior

Jackson Enum-এর ক্ষেত্রে ডিফল্টভাবে Enum-এর name() মেথড ব্যবহার করে Serialization এবং valueOf() মেথড ব্যবহার করে Deserialization করে।

উদাহরণ:

import com.fasterxml.jackson.databind.ObjectMapper;

enum Status {
    ACTIVE,
    INACTIVE,
    PENDING
}

public class EnumExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        // Enum Serialization
        String json = objectMapper.writeValueAsString(Status.ACTIVE);
        System.out.println("Serialized JSON: " + json); // "ACTIVE"

        // Enum Deserialization
        Status status = objectMapper.readValue("\"ACTIVE\"", Status.class);
        System.out.println("Deserialized Enum: " + status); // ACTIVE
    }
}

Custom Enum Serialization এবং Deserialization

কখনও কখনও Enum-এ কাস্টম স্ট্রিং বা ভিন্ন মান সিরিয়ালাইজ করতে হয়। এই ক্ষেত্রে Jackson-এর @JsonValue এবং @JsonCreator ব্যবহার করা হয়।

কাস্টম মানসহ উদাহরণ:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.ObjectMapper;

enum Status {
    ACTIVE("active_status"),
    INACTIVE("inactive_status"),
    PENDING("pending_status");

    private final String value;

    // Constructor
    Status(String value) {
        this.value = value;
    }

    // Serialization এর জন্য
    @JsonValue
    public String getValue() {
        return value;
    }

    // Deserialization এর জন্য
    @JsonCreator
    public static Status fromValue(String value) {
        for (Status status : Status.values()) {
            if (status.value.equals(value)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Invalid value: " + value);
    }
}

public class CustomEnumExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        // Serialization
        String json = objectMapper.writeValueAsString(Status.ACTIVE);
        System.out.println("Serialized JSON: " + json); // "active_status"

        // Deserialization
        Status status = objectMapper.readValue("\"inactive_status\"", Status.class);
        System.out.println("Deserialized Enum: " + status); // INACTIVE
    }
}

Enum-এর সাথে JSON ফিল্ডসহ কাজ করা

কখনও Enum একটি JSON অবজেক্টের অংশ হতে পারে। উদাহরণস্বরূপ, যখন Enum JSON অবজেক্টের একটি ফিল্ড হিসেবে ব্যবহৃত হয়:

import com.fasterxml.jackson.databind.ObjectMapper;

enum Status {
    ACTIVE, INACTIVE, PENDING
}

class User {
    private String name;
    private Status status;

    // Constructor
    public User(String name, Status status) {
        this.name = name;
        this.status = status;
    }

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }
}

public class EnumWithObjectExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        // User Object তৈরি
        User user = new User("John Doe", Status.ACTIVE);

        // Serialization
        String json = objectMapper.writeValueAsString(user);
        System.out.println("Serialized JSON: " + json);

        // Deserialization
        User deserializedUser = objectMapper.readValue(json, User.class);
        System.out.println("Deserialized User: " + deserializedUser.getName() + ", " + deserializedUser.getStatus());
    }
}

আউটপুট:

Serialized JSON: {"name":"John Doe","status":"ACTIVE"}
Deserialized User: John Doe, ACTIVE

Key Annotations এবং তাদের ভূমিকা

  1. @JsonValue:
    • Enum-এর সিরিয়ালাইজেশনের সময় একটি নির্দিষ্ট মান (string বা অন্য কিছু) ব্যবহার করতে দেয়।
    • উদাহরণ: "active_status"
  2. @JsonCreator:
    • Deserialization-এর সময় JSON থেকে Enum-এ রূপান্তরের নিয়ম নির্ধারণ করে।
    • উদাহরণ: JSON ভ্যালু থেকে Enum-এ কাস্টম রূপান্তর।

Custom Serializer এবং Deserializer ব্যবহার:

কখনও ডিফল্ট Jackson মেকানিজম যথেষ্ট না হলে আমরা কাস্টম Serializer/Deserializer ব্যবহার করতে পারি।

Custom Serializer:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

public class StatusSerializer extends JsonSerializer<Status> {
    @Override
    public void serialize(Status status, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(status.name().toLowerCase()); // ছোট হরফে Enum নাম
    }
}

Custom Deserializer:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class StatusDeserializer extends JsonDeserializer<Status> {
    @Override
    public Status deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String value = p.getValueAsString();
        return Status.valueOf(value.toUpperCase()); // বড় হরফে Enum নাম
    }
}

Serializer/Deserializer ব্যবহারের উদাহরণ:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;

public class CustomEnumSerializerExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        // মডিউল তৈরি এবং Serializer/Deserializer সেট করা
        SimpleModule module = new SimpleModule();
        module.addSerializer(Status.class, new StatusSerializer());
        module.addDeserializer(Status.class, new StatusDeserializer());
        objectMapper.registerModule(module);

        // Serialization
        String json = objectMapper.writeValueAsString(Status.ACTIVE);
        System.out.println("Serialized JSON: " + json); // "active"

        // Deserialization
        Status status = objectMapper.readValue("\"inactive\"", Status.class);
        System.out.println("Deserialized Enum: " + status); // INACTIVE
    }
}

  1. ডিফল্ট Behavior: Enum-এর name() এবং valueOf() মেথড ব্যবহার করে।
  2. কাস্টমাইজেশন: @JsonValue এবং @JsonCreator দিয়ে সহজ কাস্টমাইজেশন।
  3. Custom Serializer/Deserializer: আরও জটিল প্রয়োজনের জন্য উপযোগী।
  4. ব্যবহার: API ডেভেলপমেন্টে Enum ডেটা প্রক্রিয়াকরণ ও কাস্টমাইজেশনের জন্য অত্যন্ত কার্যকর।
Content added By

Enum এর জন্য Custom Serializer তৈরি

192

Jackson Enum ডেটার Serialization (Java Enum থেকে JSON এ রূপান্তর) এবং Deserialization (JSON থেকে Java Enum এ রূপান্তর) এর জন্য ডিফল্ট পদ্ধতি ব্যবহার করে। তবে, কখনও কখনও Enum ডেটা কাস্টম ফরম্যাটে Serialize করতে হতে পারে। এ জন্য Jackson এ কাস্টম Serializer তৈরি করা হয়।


১. ডিফল্ট Serialization পদ্ধতি

Jackson ডিফল্টভাবে Enum এর name() মেথড ব্যবহার করে JSON ডেটা তৈরি করে।

উদাহরণ

public enum Status {
    ACTIVE,
    INACTIVE,
    PENDING
}

Serialization

import com.fasterxml.jackson.databind.ObjectMapper;

public class DefaultEnumSerialization {
    public static void main(String[] args) throws Exception {
        Status status = Status.ACTIVE;
        ObjectMapper mapper = new ObjectMapper();

        String json = mapper.writeValueAsString(status);
        System.out.println(json); // Output: "ACTIVE"
    }
}

২. Enum এর জন্য Custom Serializer তৈরি

স্টেপ ১: Custom Serializer ক্লাস তৈরি

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.IOException;

public class StatusSerializer extends StdSerializer<Status> {

    public StatusSerializer() {
        super(Status.class);
    }

    @Override
    public void serialize(Status value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        // Custom Serialization Logic
        gen.writeString(value.name().toLowerCase()); // Example: ACTIVE -> "active"
    }
}

স্টেপ ২: Enum ক্লাসে Serializer সংযুক্ত করা

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@JsonSerialize(using = StatusSerializer.class)
public enum Status {
    ACTIVE,
    INACTIVE,
    PENDING
}

Serialization উদাহরণ

import com.fasterxml.jackson.databind.ObjectMapper;

public class CustomEnumSerialization {
    public static void main(String[] args) throws Exception {
        Status status = Status.ACTIVE;
        ObjectMapper mapper = new ObjectMapper();

        String json = mapper.writeValueAsString(status);
        System.out.println(json); // Output: "active"
    }
}

৩. Enum এর সাথে অতিরিক্ত ডেটা Serialize করা

স্টেপ ১: Enum এ অতিরিক্ত ফিল্ড যোগ করা

public enum Status {
    ACTIVE("The user is active"),
    INACTIVE("The user is inactive"),
    PENDING("The user is pending approval");

    private final String description;

    Status(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

স্টেপ ২: Custom Serializer তৈরি

public class StatusSerializer extends StdSerializer<Status> {

    public StatusSerializer() {
        super(Status.class);
    }

    @Override
    public void serialize(Status value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("status", value.name());
        gen.writeStringField("description", value.getDescription());
        gen.writeEndObject();
    }
}

স্টেপ ৩: Serialization

@JsonSerialize(using = StatusSerializer.class)
public enum Status {
    ACTIVE("The user is active"),
    INACTIVE("The user is inactive"),
    PENDING("The user is pending approval");

    private final String description;

    Status(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}
import com.fasterxml.jackson.databind.ObjectMapper;

public class CustomEnumSerializationWithDetails {
    public static void main(String[] args) throws Exception {
        Status status = Status.ACTIVE;
        ObjectMapper mapper = new ObjectMapper();

        String json = mapper.writeValueAsString(status);
        System.out.println(json);
    }
}

Output:

{
  "status": "ACTIVE",
  "description": "The user is active"
}

৪. Enum এর Deserialization কাস্টমাইজ করা

Custom Deserializer তৈরি

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class StatusDeserializer extends JsonDeserializer<Status> {

    @Override
    public Status deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String value = p.getText().toUpperCase(); // Example: "active" -> "ACTIVE"
        return Status.valueOf(value);
    }
}

Enum ক্লাসে Deserializer সংযুক্ত করা

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

@JsonDeserialize(using = StatusDeserializer.class)
public enum Status {
    ACTIVE,
    INACTIVE,
    PENDING
}

Deserialization উদাহরণ

public class CustomEnumDeserialization {
    public static void main(String[] args) throws Exception {
        String json = "\"active\""; // JSON string

        ObjectMapper mapper = new ObjectMapper();
        Status status = mapper.readValue(json, Status.class);

        System.out.println(status); // Output: ACTIVE
    }
}

  • Custom Serializer ব্যবহার করে Enum এর ফরম্যাট কাস্টমাইজ করা যায়।
  • Custom Deserializer ব্যবহার করে JSON থেকে Enum এ ডেটা মেপিং নিয়ন্ত্রণ করা যায়।
  • এই পদ্ধতিগুলো API ডেভেলপমেন্টে, বিশেষত যেখানে Enum ডেটা হিউম্যান-রিডেবল বা কাস্টম ফরম্যাটে থাকা দরকার, সেগুলোতে কার্যকর।
Content added By

Enum Mapping এবং Complex JSON Structure

195

Jackson-এ Enum Mapping এবং Complex JSON Structure নিয়ে কাজ করা খুবই সহজ এবং কার্যকর। Jackson JSON ডেটার সঙ্গে জাভার enum টাইপ এবং জটিল কাঠামো যেমন নেস্টেড অবজেক্ট, অ্যারে, বা ম্যাপ হ্যান্ডেল করতে উন্নত API সরবরাহ করে।


1. Enum Mapping

Jackson সহজেই JSON ডেটার সঙ্গে Java enum টাইপ ম্যাপ করতে পারে। এছাড়া, কাস্টম নাম বা মান ব্যবহার করতে চাইলে বিশেষ এনোটেশন ব্যবহার করা যায়।

উদাহরণ: Enum Mapping

Enum ক্লাস:
enum Status {
    ACTIVE,
    INACTIVE,
    PENDING
}
JSON:
{
  "id": 101,
  "name": "John Doe",
  "status": "ACTIVE"
}
কোড:
import com.fasterxml.jackson.databind.ObjectMapper;

class User {
    public int id;
    public String name;
    public Status status;
}

public class Main {
    public static void main(String[] args) throws Exception {
        String json = """
        {
            "id": 101,
            "name": "John Doe",
            "status": "ACTIVE"
        }
        """;

        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(json, User.class);

        System.out.println("ID: " + user.id);
        System.out.println("Name: " + user.name);
        System.out.println("Status: " + user.status);

        // Serialize back to JSON
        String serializedJson = objectMapper.writeValueAsString(user);
        System.out.println("Serialized JSON: " + serializedJson);
    }
}

আউটপুট:

ID: 101
Name: John Doe
Status: ACTIVE
Serialized JSON: {"id":101,"name":"John Doe","status":"ACTIVE"}

Custom Enum Mapping

কাস্টম মান ব্যবহার করতে চাইলে @JsonValue এবং @JsonCreator ব্যবহার করা হয়।

কোড:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

enum Status {
    ACTIVE("active"),
    INACTIVE("inactive"),
    PENDING("pending");

    private final String value;

    Status(String value) {
        this.value = value;
    }

    @JsonValue
    public String getValue() {
        return value;
    }

    @JsonCreator
    public static Status fromValue(String value) {
        for (Status status : values()) {
            if (status.value.equals(value)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Unknown value: " + value);
    }
}

2. Complex JSON Structure

Jackson জটিল JSON কাঠামো যেমন নেস্টেড অবজেক্ট, লিস্ট, এবং ম্যাপ হ্যান্ডেল করতে সক্ষম।

উদাহরণ: Complex JSON Structure

JSON:
{
  "id": 101,
  "name": "John Doe",
  "address": {
    "city": "Dhaka",
    "zip": "1212"
  },
  "skills": ["Java", "Spring", "Jackson"],
  "metadata": {
    "createdBy": "admin",
    "updatedBy": "editor"
  }
}
কোড:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Map;

class Address {
    public String city;
    public String zip;
}

class User {
    public int id;
    public String name;
    public Address address;
    public List<String> skills;
    public Map<String, String> metadata;
}

public class Main {
    public static void main(String[] args) throws Exception {
        String json = """
        {
            "id": 101,
            "name": "John Doe",
            "address": {
                "city": "Dhaka",
                "zip": "1212"
            },
            "skills": ["Java", "Spring", "Jackson"],
            "metadata": {
                "createdBy": "admin",
                "updatedBy": "editor"
            }
        }
        """;

        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(json, User.class);

        // Printing user details
        System.out.println("ID: " + user.id);
        System.out.println("Name: " + user.name);
        System.out.println("City: " + user.address.city);
        System.out.println("Skills: " + user.skills);
        System.out.println("Metadata: " + user.metadata);

        // Serialize back to JSON
        String serializedJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
        System.out.println("Serialized JSON:\n" + serializedJson);
    }
}

আউটপুট:

ID: 101
Name: John Doe
City: Dhaka
Skills: [Java, Spring, Jackson]
Metadata: {createdBy=admin, updatedBy=editor}

Serialized JSON:
{
  "id": 101,
  "name": "John Doe",
  "address": {
    "city": "Dhaka",
    "zip": "1212"
  },
  "skills": ["Java", "Spring", "Jackson"],
  "metadata": {
    "createdBy": "admin",
    "updatedBy": "editor"
  }
}

Key Features:

  1. Enum Mapping:
    • Enum এর স্ট্রিং ম্যানিপুলেশন সহজ।
    • কাস্টম ভ্যালু (যেমন "active") সেট করা যায়।
  2. Complex JSON Structure:
    • নেস্টেড অবজেক্ট এবং অ্যারে সহজেই হ্যান্ডেল করা যায়।
    • Dynamic JSON এর জন্য ম্যাপ ব্যবহার করা হয়।

ব্যবহারিক ক্ষেত্র:

  • API ডেভেলপমেন্ট যেখানে Enum এবং জটিল JSON কাঠামো কাজ করে।
  • ডাটা প্রসেসিং এবং JSON থেকে Java Object Mapping।

এই পদ্ধতিগুলো ব্যবহার করে সহজেই Enum এবং জটিল JSON কাঠামো পরিচালনা করা যায়।

Content added By

Jackson এর মাধ্যমে Enum কাস্টমাইজ করা

191

Jackson লাইব্রেরি ডিফল্টভাবে Java Enum কে JSON-এ serialize এবং deserialize করতে পারে। তবে কখনো কখনো আপনাকে Enum-এর ডিফল্ট serialization বা deserialization কাস্টমাইজ করতে হতে পারে। Jackson Enum কাস্টমাইজ করার জন্য অনেক ফিচার সরবরাহ করে, যেমন @JsonValue, @JsonCreator, এবং কাস্টম serializers/deserializers।


ডিফল্ট Enum Serialization এবং Deserialization

ডিফল্টভাবে, Jackson Enum-এর name (যেমন, Enum.name()) serialize করে।

উদাহরণ:

import com.fasterxml.jackson.databind.ObjectMapper;

public class DefaultEnumExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Enum Serialization
        Status status = Status.ACTIVE;
        String json = mapper.writeValueAsString(status);
        System.out.println("Serialized JSON: " + json);

        // Enum Deserialization
        Status deserializedStatus = mapper.readValue("\"ACTIVE\"", Status.class);
        System.out.println("Deserialized Enum: " + deserializedStatus);
    }
}

enum Status {
    ACTIVE, INACTIVE, PENDING
}

আউটপুট:

Serialized JSON: "ACTIVE"
Deserialized Enum: ACTIVE

1. @JsonValue এর মাধ্যমে Enum Serialization কাস্টমাইজ করা

@JsonValue ব্যবহার করে Enum কে কাস্টম string, number বা অন্য ফরম্যাটে serialize করা যায়।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonValue;

enum Status {
    ACTIVE("Active Status"),
    INACTIVE("Inactive Status"),
    PENDING("Pending Status");

    private final String displayName;

    Status(String displayName) {
        this.displayName = displayName;
    }

    @JsonValue
    public String getDisplayName() {
        return displayName;
    }
}

public class JsonValueExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Serialization
        Status status = Status.ACTIVE;
        String json = mapper.writeValueAsString(status);
        System.out.println("Serialized JSON: " + json);
    }
}

আউটপুট:

Serialized JSON: "Active Status"

2. @JsonCreator এর মাধ্যমে Enum Deserialization কাস্টমাইজ করা

@JsonCreator ব্যবহার করে JSON থেকে Enum কে কাস্টমভাবে deserialize করা যায়।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

enum Status {
    ACTIVE("Active Status"),
    INACTIVE("Inactive Status"),
    PENDING("Pending Status");

    private final String displayName;

    Status(String displayName) {
        this.displayName = displayName;
    }

    @JsonValue
    public String getDisplayName() {
        return displayName;
    }

    @JsonCreator
    public static Status forValue(String value) {
        for (Status status : values()) {
            if (status.displayName.equalsIgnoreCase(value)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Invalid Status: " + value);
    }
}

public class JsonCreatorExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Deserialization
        Status status = mapper.readValue("\"Active Status\"", Status.class);
        System.out.println("Deserialized Enum: " + status);
    }
}

আউটপুট:

Deserialized Enum: ACTIVE

3. Enum Serialization এবং Deserialization কাস্টম Serializer/Deserializer ব্যবহার করে

Jackson-এ কাস্টম Serializer এবং Deserializer তৈরি করে Enum কাস্টমাইজ করা যায়।

Serializer এবং Deserializer তৈরি:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.IOException;

// Custom Serializer
class StatusSerializer extends JsonSerializer<Status> {
    @Override
    public void serialize(Status status, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(status.getDisplayName().toUpperCase());
    }
}

// Custom Deserializer
class StatusDeserializer extends JsonDeserializer<Status> {
    @Override
    public Status deserialize(com.fasterxml.jackson.core.JsonParser p, com.fasterxml.jackson.databind.DeserializationContext ctxt)
            throws IOException {
        String value = p.getValueAsString();
        for (Status status : Status.values()) {
            if (status.getDisplayName().equalsIgnoreCase(value)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Invalid Status: " + value);
    }
}

// Enum with Custom Serializer/Deserializer
@JsonSerialize(using = StatusSerializer.class)
@JsonDeserialize(using = StatusDeserializer.class)
enum Status {
    ACTIVE("Active Status"),
    INACTIVE("Inactive Status"),
    PENDING("Pending Status");

    private final String displayName;

    Status(String displayName) {
        this.displayName = displayName;
    }

    public String getDisplayName() {
        return displayName;
    }
}

ব্যবহার:

public class CustomSerializerDeserializerExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Serialization
        Status status = Status.ACTIVE;
        String json = mapper.writeValueAsString(status);
        System.out.println("Serialized JSON: " + json);

        // Deserialization
        Status deserializedStatus = mapper.readValue("\"ACTIVE STATUS\"", Status.class);
        System.out.println("Deserialized Enum: " + deserializedStatus);
    }
}

আউটপুট:

Serialized JSON: "ACTIVE STATUS"
Deserialized Enum: ACTIVE

4. JSON ফিল্ডের মাধ্যমে Enum Map করা

যদি JSON এ Enum ফিল্ড অন্য কোনো ফিল্ডের মান অনুসারে নির্ধারিত হয়, তাহলে এটি কাস্টমভাবে পরিচালনা করতে হয়।

উদাহরণ:

enum PaymentStatus {
    SUCCESS, FAILURE, PENDING
}

class Payment {
    private String transactionId;
    private PaymentStatus status;

    // Getters and Setters
    public String getTransactionId() {
        return transactionId;
    }

    public void setTransactionId(String transactionId) {
        this.transactionId = transactionId;
    }

    public PaymentStatus getStatus() {
        return status;
    }

    public void setStatus(PaymentStatus status) {
        this.status = status;
    }
}

public class PaymentExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // JSON to Object
        String json = """
                      {
                          "transactionId": "TXN12345",
                          "status": "SUCCESS"
                      }
                      """;
        Payment payment = mapper.readValue(json, Payment.class);
        System.out.println("Payment Status: " + payment.getStatus());
    }
}

আউটপুট:

Payment Status: SUCCESS

Jackson-এর মাধ্যমে Enum serialization এবং deserialization কাস্টমাইজ করতে:

  1. @JsonValue এবং @JsonCreator সাধারণত সহজ এবং কার্যকর।
  2. কাস্টম Serializer/Deserializer জটিল কেসের জন্য প্রয়োজন।
  3. API-এর ভিন্ন ভিন্ন কনটেক্সটে Enum কাস্টমাইজ করার জন্য কাস্টমাইজেশন গুরুত্বপূর্ণ।

আপনার প্রয়োজনের উপর নির্ভর করে সঠিক পদ্ধতি নির্বাচন করুন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...